package models;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

import play.data.validation.Required;
import play.db.jpa.Model;
import controllers.CustomCRUD;

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Comible extends Model {
	
	private static final long serialVersionUID = 8084298708378542353L;

	@Required
	private String nombre;

	@Enumerated(EnumType.STRING)
	@Required
	private Visibilidad visibilidad;
	
	private String iconPath;

	public Comible(String nombre) {
		this.nombre = nombre;
		this.visibilidad = Visibilidad.TODOS;
	}

	protected abstract Integer calcularCalorias();
	
	public static List<Comible> findByNombre(String nombre) {

		// deja los datos en minuscula para que las busquedas coincidan
		List<Comible> comibles = Comible.find("LOWER(nombre) like ? and visibilidad = 'TODOS'", "%" + nombre.toLowerCase() + "%").fetch(10);

		// TODO: ojo la performance, hacer un join en lugar de ir 2 veces a la BD. Tampoco está bueno el if isPaciente.. sacarlo cuando sea posible!
		if(CustomCRUD.getUsuarioLogueado().isPaciente()){
			for (Plato plato : ((Paciente)CustomCRUD.getUsuarioLogueado()).getPlatosAsignadosAPaciente()) {
				//Ver si el containts funca igual al like de la BD. y hacer dps. Extract method.
				if (!comibles.contains(plato) && plato.getNombre().toLowerCase().contains(nombre.toLowerCase())) {
					comibles.add(plato);
				}
			}
		}
		
		return comibles;
	}
	
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	@Override
	public String toString() {
		return "Nombre=" + this.nombre + "," + super.toString();
	}

	public Visibilidad getVisibilidad() {
		return visibilidad;
	}

	public void setVisibilidad(Visibilidad visibilidad) {
		this.visibilidad = visibilidad;
	}

	public String getIconPath() {
		return iconPath;
	}

	public void setIconPath(String iconPath) {
		this.iconPath = iconPath;
	}

}
